/**
 * TDS PEC 4
 * Grupo 3H2M
 *
 * El paquete <code>edu.uoc.tds.pec4.server.bbdd</code> agrupa todos los
 * interfaces y clases que encapsulan los objetos de acceso a datos (DAO),para
 * realizar el acceso a datos. La base de datos es PostgreSQL.
 */
package edu.uoc.tds.pec4.server.bbdd;

import edu.uoc.tds.pec4.beans.AulaDTO;
import edu.uoc.tds.pec4.beans.CFisicaDTO;
import edu.uoc.tds.pec4.beans.EquipamientoDTO;
import edu.uoc.tds.pec4.beans.LocalizacionDTO;
import edu.uoc.tds.pec4.beans.ReservaDTO;
import edu.uoc.tds.pec4.beans.SolicitudDTO;
import edu.uoc.tds.pec4.server.bbdd.exceptions.DataBaseDAOException;
import edu.uoc.tds.pec4.server.bbdd.exceptions.GestorAulasException;
import java.rmi.RemoteException;
import java.util.List;

/**
 * El interfaz <code>ISolicitudDAO</code> es el componente de software que suministra
 * una interfaz común entre la aplicación y la base de datos, relacionada con los
 * servicios del subsistema Conexión y Aulas.<br />
 * Extiende la clase <code>DataBaseDAO</code><br />
 * Es el interfaz común que todas las implementaciones de ISolicitudDAO deben cumplir.<br />
 *
 * @author	Jaime Marcos de la Calle
 * @author	Luis Rodríguez-Manzaneque Sánchez
 * @version	24/11/2011
 * @since	1.00
 * @see         edu.uoc.tds.pec4.server.bbdd.exceptions.DataBaseDAOException
 */
public interface ISolicitudDAO {

    /**
     * Devuelve la lista de solicitudes que existen actualmente.
     * @return  La lista de todos los solicitudes de la aplicación
     * @throws  DataBaseDAOException En caso de generarse una excepción de acceso
     *          a la base de datos se dispara al nivel superior
     */
    public List<SolicitudDTO> listaSolicitudes() throws DataBaseDAOException;

    /**
     * Obtiene un listado de la base de datos con todas las solicitudes que cumplen
     * con los filtros establecidos.
     * @param pais      El país por el que se quiere filtrar
     * @param provincia La provincia por la que se quiere filtrar
     * @param ciudad    La ciudad por la que se quiere filtrar
     * @param tiposSol  Un array con la lista de tipos de solicitudes elegidas
     * @param estados   Un array con la lista de los estados de la solicitud
     * @return La lista de las solicitudes filtradas por localización, tipos
     * y/o estados
     * @throws  DataBaseDAOException En caso de generarse una excepción de acceso
     *          a la base de datos se dispara al nivel superior
     */
    public List<SolicitudDTO> listaSolicitudes(LocalizacionDTO local,
            List<Integer> tiposSol, List<Integer> estados) throws DataBaseDAOException;
    /**
     * Obtiene un listado de la base de datos con todas las solicitudes que cumplen
     * con los filtros establecidos.
     * @param pais      El país por el que se quiere filtrar
     * @param provincia La provincia por la que se quiere filtrar
     * @param ciudad    La ciudad por la que se quiere filtrar
     * @param tiposSol  Un array con la lista de tipos de solicitudes elegidas
     * @param estados   Un array con la lista de los estados de la solicitud
     * @param login     Id del cliente solicitante
     * @return La lista de las solicitudes filtradas por localización, tipos,
     * estados y cliente solicitante
     * @throws  DataBaseDAOException En caso de generarse una excepción de acceso
     *          a la base de datos se dispara al nivel superior
     */
    public List<SolicitudDTO> listaSolicitudes(LocalizacionDTO local,
            List<Integer> tiposSol, Integer estado,String login)throws DataBaseDAOException;
    
    /**
     * Obtiene la solicitud de la que se envía por parámetro su identificador
     * @param idSolicitud      El identificador de solicitud
     * @return La solicitud de la que se quieren obtener todos sus datos
     * @throws RemoteException
     * @throws GestorAulasException
     */
    public SolicitudDTO getSolicitud(int idSolicitud) throws DataBaseDAOException;


    public List<ReservaDTO> listaReservas() throws DataBaseDAOException;
    
    public void insertarSolicitud(SolicitudDTO solicitud) throws DataBaseDAOException;


    public List<ReservaDTO> listaReservas(LocalizacionDTO local,
        List<Integer> estados,String fechaDesde,String fechaHasta) throws DataBaseDAOException;
    
    
    
                /**
     * Obtiene un listado de la base de datos con todas las solicitudes que cumplen
     * con los filtros establecidos.
     * @param pais      El país por el que se quiere filtrar
     * @param provincia La provincia por la que se quiere filtrar
     * @param ciudad    La ciudad por la que se quiere filtrar
     * @param tiposRes  Un array con la lista de tipos de solicitudes elegidas
     * @param estado    Integer con el estado de la reserva
     * @param login     Id del cliente solicitante
     * @return La lista de las solicitudes filtradas por localización, tipos,
     * estados y cliente solicitante
     * @throws  DataBaseDAOException En caso de generarse una excepción de acceso
     *          a la base de datos se dispara al nivel superior
     */
    public List<SolicitudDTO> listaReservas(LocalizacionDTO local,
            List<Integer> tiposRes, Integer estado,String login)throws DataBaseDAOException;
    
    public List<AulaDTO> listaAulas(LocalizacionDTO local,
            List<Integer> estados,String fechaDesde, String fechaHasta) throws DataBaseDAOException;



    public void grabarSolicitud (SolicitudDTO solicitud, List<CFisicaDTO> fisicas, 
            List<EquipamientoDTO> equipamiento, List<Integer> cantidad) throws DataBaseDAOException;
    
    /**
     * Cancela la solicitud que se envía por parámetro su identificador
     * @param idSolicitud      El identificador de solicitud
     * @return true si es correcta la eliminacion, false en caso contrario
     * @throws RemoteException
     * @throws GestorConexionException
     */
    public boolean cancelarSolicitud(int idSolicitud) throws DataBaseDAOException;
    
    /**
     * Cancela la reserva que se envía por parámetro su identificador
     * @param idReserva      El identificador de la reserva
     * @return true si es correcta la eliminacion, false en caso contrario
     * @throws RemoteException
     * @throws GestorConexionException
     */
    public boolean cancelarReserva(int idReserva) throws DataBaseDAOException;
}

